package 数组;
import java.util.*;

// 降序为最大排列，升序为最小排列
// 1 从后向前查找第一个相邻升序的元素对 (i,j)，满足 A[i] < A[j]。此时 [j,end) 必然是降序
// 2 在 [j,end) 从后向前查找第一个满足 A[i] < A[k] 的 k。A[i]、A[k] 分别就是上文所说的「小数」、「大数」
// 3 将 A[i] 与 A[k] 交换
// 4 可以断定这时 [j,end) 必然是降序，逆置 [j,end)，使其升序
// 5 如果在步骤 1 找不到符合的相邻元素对，说明当前 [begin,end) 为一个降序顺序，则直接跳到步骤 4

public class nextPermutation {
    public static void nextPermutationM(int[] nums) {
        // 从后往前找到第一个比后一个数小的数
        int i = nums.length - 2;
        // 如果i大于等于0且nums[i]大于等于nums[i+1]，则继续往前找
        while(i >= 0 && nums[i] >= nums[i+1]) {
            i--;
        }
        // 如果i大于0，则从后往前找到第一个比nums[i]大的数
        if(i >= 0){
            // 从后往前找到第一个比nums[i]大的数
            int j = nums.length - 1;
            while(j >= 0 && nums[i] >= nums[j]) {
                j--;
            }
                
            // 交换nums[i]和nums[j]
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }

        // 将i+1到nums.length-1的数反转
        int l = i + 1, r = nums.length - 1;
        while(l <= r){
            // 交换nums[l]和nums[r]
            int temp = nums[l];
            nums[l++] = nums[r];
            nums[r--] = temp;
        }
    }
    public static void main(String[] args) {
        // 使用Scanner读取输入
        Scanner sc = new Scanner(System.in);
        // 读取输入的数组，以逗号分隔
        String[] s = sc.nextLine().split(",");
        // 将输入的数组转换为int数组
        int[] nums = new int[s.length];
        for(int i = 0; i < nums.length; i++) {
            nums[i] = Integer.parseInt(s[i]);
        }
        // 调用nextPermutationM方法
        nextPermutationM(nums);
        // 输出结果
        System.out.println(Arrays.toString(nums));
        // 关闭Scanner
        sc.close();
    }
}
